package com.yhn.geekanime.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.validation.constraints.NotNull;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池配置类
 *
 * @author 86177
 */
@Configuration
public class ThreadPoolExecutorConfig {
    //配置一个线程池
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        //创建一个线程工厂，控制每一个线程的生成和属性
        ThreadFactory threadFactory = new ThreadFactory() {
            //初始化线程数为1
            private int count = 1;

            @Override
         /*
           每当线程池需要创建新线程时就会调用newThread方法
           @NotNull Runnable r 表示方法参数r永远不会为null，如果调用这个方法时传递了一个null参数就会报错
          */
            public Thread newThread(@NotNull Runnable r) {
                // ，创建了一个新线程，一定要将这个 r 放入到线程当中
                Thread thread = new Thread(r);
                //设置线程名称
                thread.setName("线程：" + count);
                // 任务++
                count++;
                //返回创建的现场
                return thread;
            }
        };
        //默认是AbortPolicy策略
        //创建一个线程池，核心大小是2，最大线程是4，任务队列为阻塞队列，只有自定义的线程工厂创建
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(100), threadFactory);
        return threadPoolExecutor;
    }
}
